package com.tedu.api.io;

import org.junit.Test;

import java.io.*;

/**
 * 、标准流：IO流处理异常对象
 *
 * 高级流：BufferedOutputStream   缓冲输出流   写       bos.txt
 *         BufferedInputStream     缓冲输入流   读入
 */
public class IOSAPI {
    /**
     * 缓冲输入流:构造器--->异常对象
     * 字符流【转换流】---解决：缓冲输入流读取单位 为字节问题
     * InputStreamReader   读取单位：字符
     * OutputStreamWriter  写出单位：字符   调用字符串getBytes写出文本
     * 缓冲输入流：具备功能：合理传输数据   效率提高
     * 构造器具备：添加字符集：UTF8外国码
     * new    BUfferedOutputStream(低级流引用，size:存字节数组【指定】)
     * 问题一：不能指定字符集
     *     二：不能指定字符读取
     */
    @Test
    public void testBIS(){
//        //创建低级流
//        FileInputStream fis=new FileInputStream("bos.txt");
//        //创建高级流---指定字符集----缓冲不具备功能----新【转换流】
//        BufferedInputStream bos=new BufferedInputStream(fis);
//        /**
//         * read()-----读：一个字节，字节数组--->专门读文字
//         */
//        bos.read();

    }
    /**
     * 针对于缓冲输出/入功能上的限定----传输：文本
     *
     * 字符流【转换流】 ---解决：缓冲输入流读取单位 为字节问题
     *       InputStreamReader 读取单位：字符
     *       OutputStreamWriter 写出单位：字符   调用字符串grtBytes写出文本
     *       需求：重新写流---针对：文字  写出文本：osw.txt
     */
    @Test
    public void testOSW(){
        //1.标准流：1.置空流
        FileOutputStream fos=null;
        OutputStreamWriter osw=null;
        //创建低级流
        try {
            fos=new FileOutputStream("osw.txt");
            //不考虑效率---只穿输文本，---字符输出流：输出单位字符形式
            //字符流：都可以在构造器第二个参数指定编码集
            osw=new OutputStreamWriter(fos,"UTF8");
            //write()    直接写出文本【不需要将文本转换为字节数组】
            osw.write("给老铁来个双击666");
            osw.write("666\n");//换行：字符  char
            osw.write("777");
        }catch(FileNotFoundException e){
            //文件不存在
            e.printStackTrace();
        }catch(UnsupportedEncodingException e){
            //字符集转换
            e.printStackTrace();
        }
        catch (IOException e) {
            //IO流异常：所欲传输失败总异常
            e.printStackTrace();
        } finally {
            //关闭高级流：字符输出流
            if (osw!=null){
                try {
                    osw.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

        }


    }

    /**高级流【处理流】---转换流：特点：套在低级流上，被其他高级流套上
     * 字符输入流  ---单元测试testISR()      读入    文本【字符串？】
     * 字符输出流  ----单元测试：testOSW()   写入      文本【字符串】
     * InputStreamReader   字符输出流    不可以读入文本
     *
     * 高级流【处理流】  -----转换流【字符流】----缓冲字符流：解决读入、写出都是字符形式
     * BufferedReader   缓冲字符输入流---解决：InputStreamReader   读入字节形式
     *                                      BufferedReader      读入字符形式
     * BufferedWriter
     * 需求：ISR字符输入流读取  osw.txt文件
     *      ①当前代码转换为标准IO：捕获异常
     *      ②读取每行文本？     readLine()    提示：不为null代表有文本
     *      写出：给老铁来个双击666      参考：CV复制粘贴
     *               777
     */
    @Test
    public void testISR() throws IOException {
        //创建低级流
        FileInputStream fis=new FileInputStream("osw.txt");
        //创建高级流----转换流----字符输出流
        InputStreamReader isr=new InputStreamReader(fis,"UTF8");
        //流  read()  问题：读入数据单位：字节，而不是字符，读字符
//                 转换流----套高级流：缓冲字符输入|出流
//创建高级流----针对转化牛流中：字符输入流无法读取形式：
//                          字符的情况---缓冲字符输入流
        BufferedReader br=new BufferedReader(isr);
        /**BufferedReader类
         * readLine  读入若干字符串，直到读到没有换行符为止
         *
         */
        //接受输出字符串
        String line=null;
        //判断条件：文本中一直有内容，一直读  一行文本
        while((line=br.readLine())!=null){
            System.out.println("打印读到字符串："+line);
        }


    }
    /**
     * 作业2：读取IOSAPI.java文件----所有代码---写出控制台
     */
    @Test
    public void testHomeWork2() throws IOException {

        //1.创建低级流--读入---找IOSAPI.java       代表路径：File.separator
        FileInputStream fis=new FileInputStream("src\\main\\java\\com\\tedu\\api\\io\\IOSAPI.java");
         //路径：src\main\java\com\tedu\api\io\IOSAPI.java

        //2.创建高级流---【读入内容文本】---转换流--无法读取文本
        InputStreamReader isr=new InputStreamReader(fis,"UTF8");
        //3.创建高级流：字符串类型--保存每次读取的一行文本
BufferedReader bd=new BufferedReader(isr);
        //4.创建变量：字符串类型---保存每次读取的一行文本
        String line=null;//null代表没有内容【等同于换行】
        //5.一直读入：每行文本保存line中，如果line不为null，一直读
        while ((line=bd.readLine())!=null){
            System.out.println("..."+line);
        }
        //6.关闭高级流
        isr.close();
    }
    /**高级流：
     * BufferedWriter---低配版本输出流【缓冲输出流】
     * PrintWriter---高配版本输出流【字符输出流】
     *1. 高级流不能直接创建---直接创建【不需要创建低级流】
     * 2.封装内存所有流的特点
     * 需求：写出文件 pw.txt---文本内容，需要指定编码集：UTF8
     */
    @Test
    public void testPW() throws FileNotFoundException, UnsupportedEncodingException {
        //低级流：输出流
        FileOutputStream fos=new FileOutputStream("pw.txt");
        //高级流：转换流：功能:指定编码集
        OutputStreamWriter osw=new OutputStreamWriter(fos);
        //高级流：转换流：功能:提高效率
        BufferedWriter bw=new BufferedWriter(osw);
        //创建高级流：低级流：输出流+转换流+缓冲流
        PrintWriter pw=new PrintWriter(bw);
        //写出功能：print()打印一行文本   不换行
        //          print()    打印一行文本   不换行
        pw.print("你就是");
        pw.println("我的小可爱");

        pw.close();
    }
}
